﻿using System.Linq;

namespace Nomo.UnityCoreModule
{
    /// <summary>
    /// 音频提供者。
    /// </summary>
    internal sealed class AudioProvider : CoreModule.Singleton<AudioProvider>
    {
        private AudioProvider() { }

        private readonly System.Collections.Generic.Dictionary<string, UnityEngine.AudioClip> _audioClips = new System.Collections.Generic.Dictionary<string, UnityEngine.AudioClip>();

        /// <summary>
        /// 获取音频源。
        /// </summary>
        /// <param name="name">音频源的名称。</param>
        /// <returns>如果找到了音频源，则返回获取到的音频源；否则返回 <see langword="null"/> .</returns>
        internal UnityEngine.AudioClip GetAudioClip(string name)
        {
            // 从公共音频缓存中寻找音频。
            if (_audioClips.TryGetValue(name, out var audioClip))
            {
                return audioClip;
            }

            // 从公共音频资源包中寻找音频，如果找到，还会将其添加进缓存中。
            if (Common.CommonAudioAssetBundle.TryLoadAsset(name, out audioClip))
            {
                _audioClips.Add(name, audioClip);
                return audioClip;
            }

            // 从各个界面的资源包中寻找音频。
            if (Nodes.Node.ViewOrderAll().Any(node => node.AssetBundle.TryLoadAsset(name, out audioClip)))
            {
                return audioClip;
            }

            return audioClip;
        }
    }
}
